use vertica_rs::types::Value;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    env_logger::init();
    
    println!("=== Vertica 字符串类型演示 ===\n");
    
    // 演示各种字符串类型的处理
    demonstrate_string_types().await?;
    
    Ok(())
}

async fn demonstrate_string_types() -> Result<(), Box<dyn std::error::Error>> {
    println!("🔍 展示 Vertica 中的字符串类型处理:\n");
    
    // 创建各种字符串类型的示例数据
    let string_values = vec![
        ("VARCHAR 类型", Value::String("Hello, Vertica!".to_string())),
        ("CHAR 类型", Value::String("FIXED_LEN".to_string())),
        ("TEXT 类型", Value::String("这是一个很长的文本内容，用于测试 TEXT 类型。它可以存储大量文本数据。".to_string())),
        ("LONG VARCHAR 类型", Value::String("这是 LONG VARCHAR 类型的示例数据，可以存储更长的字符串内容。".to_string())),
        ("空字符串", Value::String("".to_string())),
        ("NULL 字符串", Value::Null),
    ];
    
    for (type_name, value) in string_values {
        println!("📊 {}:", type_name);
        print_string_details(&value)?;
        println!();
    }
    
    // 演示字符串操作
    println!("🔄 字符串操作示例:");
    demonstrate_string_operations().await?;
    
    Ok(())
}

fn print_string_details(value: &Value) -> Result<(), Box<dyn std::error::Error>> {
    match value {
        Value::String(s) => {
            if s.is_empty() {
                println!("   ✅ 值: (空字符串)");
                println!("   🔍 长度: 0 字符");
            } else {
                println!("   ✅ 值: '{}'", s);
                println!("   🔍 长度: {} 字符", s.len());
                println!("   🔍 字节数: {} 字节", s.as_bytes().len());
                println!("   🔍 是否包含 Unicode: {}", s.chars().count() != s.len());
                
                // 显示字符串的前几个字符（如果很长）
                if s.len() > 50 {
                    let preview: String = s.chars().take(47).collect();
                    println!("   🔍 预览: '{}...'", preview);
                }
            }
        },
        Value::Null => {
            println!("   ⚠️  NULL 值");
            println!("   🔍 表示字符串类型的空值");
        },
        _ => {
            println!("   ❌ 不是字符串类型");
        }
    }
    
    Ok(())
}

async fn demonstrate_string_operations() -> Result<(), Box<dyn std::error::Error>> {
    let test_strings = vec![
        Value::String("Hello World".to_string()),
        Value::String("数据库".to_string()),
        Value::String("Special chars: @#$%^&*()".to_string()),
        Value::String("UPPERCASE lowercase MiXeD".to_string()),
        Value::String("   前后有空格   ".to_string()),
    ];
    
    for value in test_strings {
        if let Value::String(s) = &value {
            println!("处理字符串 '{}'", s);
            
            // 基本字符串操作
            println!("  → 长度: {} 字符", s.len());
            println!("  → 大写: '{}'", s.to_uppercase());
            println!("  → 小写: '{}'", s.to_lowercase());
            println!("  → 去除空格: '{}'", s.trim());
            
            // 检查包含关系
            if s.contains("World") {
                println!("  → 包含 'World'");
            }
            
            // 分割字符串
            let parts: Vec<&str> = s.split_whitespace().collect();
            if parts.len() > 1 {
                println!("  → 单词数: {}", parts.len());
            }
            
            println!();
        }
    }
    
    // 演示 NULL 处理
    println!("NULL 字符串处理:");
    let null_string = Value::Null;
    match null_string {
        Value::Null => {
            println!("  ✅ 检测到 NULL 字符串值");
            println!("  ✅ 在 SQL 中对应 NULL");
        },
        _ => println!("  不是 NULL"),
    }
    
    Ok(())
}